package bancosys.tec.services.implementor.descriptor;

import java.util.List;

import jmine.tec.di.metadata.DependencyMetaData;
import jmine.tec.di.scope.TypedScope;

/**
 * Interface responsavel pela execucao de um servico.
 */
public interface ServiceExecutionProxy extends OutputNameExtractor {

    /**
     * Resolve as dependencias e executa o servico.
     * 
     * @param target o alvo - a implementacao concreta do servico
     * @param properties o escopo
     * @return Object - se o metodo de execucao devolver algum valor
     * @throws Exception se o metodo lancar uma excecao.
     */
    Object hydrateAndExecute(Object target, TypedScope properties) throws Exception;

    /**
     * Devolve os {@link DependencyMetaData} necessarios para a execucao do metodo
     * 
     * @return array de {@link DependencyMetaData}
     */
    DependencyMetaData[] getExecutionDependencies();

    /**
     * Valida as dependencias necessarias para a execucao deste servico.
     * 
     * @param properties {@link TypedScope}
     * @return List
     */
    List<String> validateExecutionDependencies(TypedScope properties);

    /**
     * Devolve o nome da coluna cujo valor será usado
     * 
     * @return {@link String}
     */
    String getColumnName();
}
